package br.com.fiap.atividade5.jbossAOP;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;

import org.jboss.aop.advice.Interceptor;
import org.jboss.aop.joinpoint.Invocation;
import org.jboss.aop.joinpoint.MethodInvocation;

import br.com.fiap.atividade5.entity.Pedido;
import br.com.fiap.atividade5.entity.PedidoProduto;

public class CalcValorPedidoInterceptor implements Interceptor {

	@Override
	public String getName() {
		return CalcValorPedidoInterceptor.class.getSimpleName();
	}

	@Override
	public Object invoke(Invocation invocation) throws Throwable {
		
		if (!(invocation instanceof MethodInvocation)) {
			return invocation.invokeNext();
		}
		
		MethodInvocation mi = (MethodInvocation) invocation;
		Pedido p = (Pedido) mi.getArguments()[0];
		
		System.out.println("Inicio do calculo do valor do pedido de numero " + p.getNumeroPedido());
		
		mi.invokeNext();
		
		calcValorPedido(p);
		
		System.out.println("Fim do calculo do valor do pedido de numero " + p.getNumeroPedido());
		
		return null;
	}
	
	
	private void calcValorPedido(Pedido p) {
		
		List<PedidoProduto> pedidoProdutos = p.getPedidosProduto();
		
		BigDecimal valorTotal = BigDecimal.ZERO;
		
		if (pedidoProdutos.size() > 10) {
			for (PedidoProduto pp : pedidoProdutos) {
				if (!pp.isHasDescontoQuantidadeItens()) {
					BigDecimal desconto = pp.getDesconto();
					
					if (desconto == null) {
						desconto = BigDecimal.ZERO;
					}
					
					pp.setDesconto(desconto.add(pp.getTotal().multiply(new BigDecimal("0.05"))));
					pp.setTotal(pp.getTotal().multiply(new BigDecimal("0.95")));
					pp.setHasDescontoQuantidadeItens(true);
				}
				
				valorTotal = valorTotal.add(pp.getTotal());
			}
			
			p.setValorTotal(valorTotal);
			
		}
		
		addTaxaAdicional(p);
		
	}
	
	private void addTaxaAdicional(Pedido pedido) {
		
		Calendar c = Calendar.getInstance();
		c.setTime(pedido.getData());
		
		int mes = c.get(Calendar.MONTH);
		
		if (mes >= Calendar.AUGUST && mes <= Calendar.SEPTEMBER) {
			pedido.setValorTotal(pedido.getValorTotal().multiply(new BigDecimal("1.1")));
		}
		
	}
	
}
